import subprocess

src = "/mnt/projects/AVSpeech/2023122812/"  # 源目录末尾不带/和带/ 意义不同，详情看下方的命令解说
dst = "/mnt/projects/video_backup/2023122812/"  # 目标末尾不带/和带/ 意义也是不同的，但作为拷贝目录，意义相同
# rsync 的 -r 表示复制目录，不加的话会抛出 skipping directory .的错误 
args = ["rsync", '-r', src, dst]  # 命令尽量使用数组，以避免类似找不到路径之类的奇怪的问题
# 执行命令方法1 此方法更容易确认命令执行的结果，推荐
process = subprocess.Popen(args=args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
                           text=True, encoding="utf-8")
outs, errs = process.communicate()
if process.returncode == 0 and outs == '' and errs == "":
    print(f"任务执行成功，状态码: {process.returncode}, outs: {outs}, errs: {errs}")
else:
    print(f"任务执行失败，状态码: {process.returncode}, outs: {outs}, errs: {errs}")
# 执行命令方法2
result = subprocess.run(args=args)   # 注意，状态码为0只代表命令结束没有抛出错误，不代表命令本身的逻辑执行成功。
print(f"任务执行结束，状态码: {result.returncode}")

"""
命令解说
a: rsync -r /mnt/projects/AVSpeech/2023122812 /mnt/projects/video_backup/2023122812
b: rsync -r /mnt/projects/AVSpeech/2023122812/ /mnt/projects/video_backup/2023122812
上面2个命令的唯一区别就是a命令的源目录比b命令的源目录后面多了一个/ ， 这个/ 的意义有很大的不同
源目录结尾有/ ：表示把路径 /mnt/projects/AVSpeech/2023122812/ 下的所有文件拷贝到 /mnt/projects/video_backup/2023122812 目录下。
拷贝的结果是 /mnt/projects/AVSpeech/2023122812/目录下的文件都被复制到 /mnt/projects/video_backup/2023122812 目录下
源目录结尾没有/ ：表示把 /mnt/projects/AVSpeech/2023122812 这个目录拷贝到 /mnt/projects/video_backup/2023122812 目录下。（仅复制目录下的文件）
拷贝的结果是 /mnt/projects/AVSpeech/2023122812/ 这个目录整体被复制到 /mnt/projects/video_backup/2023122812 目录下，也就是
 /mnt/projects/video_backup/2023122812/2023122812/ * 这种结构（连目录结构一起复制）
"""